<?php 
class venda_visitaModel extends Model{
    public $tabela = "venda_visita";
    public $pkey   = 'venda_visita_cod';
    public $dados  = array(
         
         'venda_visita_cod' => array(
	    'name'     => 'Código',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
	    'ai'      => true,
	    'grid'    => true,
	    'display' => true,
	    'private' => true
        ),
        
        'cod_usuario' => array(
	    'name'     => 'Vendedor',
	    'type'     => 'int',
	    'size'     => '11',
            'especial' => 'autentication',
            'autentication' => array('needlogin' => true),
	    'grid'    => true,
	    'display' => true,
	    'fkey' => array(
	        'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name', 'user_cargo'),
	    ),
        ),
        
        'venda_visita_criado' => array(
	    'name'     => 'Data da Visita',
	    'type'     => 'timestamp',
            'especial' => 'hide',
	    'grid'    => true,
	    'display' => true,
        ),
        
        'venda_equipe_cod' => array(
	    'name'     => 'Equipe',
	    'type'     => 'int',
	    'size'     => '11',
	    'especial' => 'session',
	    'session'  => 'venda/equipe',
	    'fkey' => array(
	        'model' => 'venda/equipe',
	        'cardinalidade' => '1n',
	        'keys' => array('venda_equipe_cod', 'venda_equipe_nome'),
	    ),
        ),
        
        'venda_evento_cod' => array(
	    'name'     => 'Evento',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    'display' => true,
            'especial' => 'session',
            'session'  => 'venda/evento',
            'notnull' => true,
	    'fkey' => array(
	        'model' => 'venda/evento',
	        'cardinalidade' => '1n',
	        'keys' => array('venda_evento_cod', 'venda_evento_titulo'),
	    ),
            'description' => 'Escolha o evento que motivou esta visita. 
                Atenção! escolha o evento correto, pois este campo será usado para 
                fazer os cálculos sobre da sua venda posteriormente'
        ),
        
        'venda_empresa_cod' => array(
	    'name'     => 'Empresa',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    'display' => true,
	    'especial' => 'session',
	    'session'  => 'venda/empresa',
	    'fkey' => array(
	        'model' => 'venda/empresa',
	        'cardinalidade' => '1n',
	        'keys' => array('venda_empresa_cod', 'venda_empresa_nome'),
	    ),
        ),
        
        'venda_funcionario_cod' => array(
	    'name'     => 'Funcionário',
	    'type'     => 'int',
	    'size'     => '11',
            'notnull' => true,
            'description' => 'Funcionário que atendeu a visita',
	    'fkey' => array(
                'filther' => array('session' => 'venda/empresa'),
	        'model' => 'venda/funcionario',
	        'cardinalidade' => '1n',
	        'keys' => array('venda_funcionario_cod', 'venda_funcionario_nome'),
	    ),
        ),
         
         'venda_visita_excluido' => array(
	    'name'     => 'Excluido',
	    'type'     => 'datetime',
	    'private' => true,
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        
         'venda_visita_status' => array(
	    'name'     => 'Status',
	    'type'     => 'enum',
	    'default' => 'pendente',
            'title' => true,
	    'options' => array(
	    	'recusou'    => 'Recusado',
	    	'aprovou'    => 'Aprovado',
	    	'pendente'   => 'Pendente',
                'confirmado' => 'Aprovado pelo Telemarketing',
                'negado'     => 'Recusado pelo Telemarketing',
                'compareceu' => 'Compareceu',
	    ),
	    'grid'    => true,
	    'display' => true,
        ),
        
        'venda_visita_bdstatus' => array(
	    'name'     => 'Status',
	    'type'     => 'enum',
	    'default' => 'saved',
            'private' => true,
	    'options' => array(
	    	'saved'    => 'Salvo',
	    	'unsaved'  => 'Não salvo',
	    ),
        ),
         'venda_visita_statuslabel' => array(
	    'name'     => 'Detalhes do Status',
	    'type'     => 'varchar',
	    'size'     => '32',
            'description' => 'Grave o motivo do status escolhido na opção anterior. 
                Por exemplo, se a visita ficou pendente coloque aqui em poucas palavras o motivo.',
             'subtitle' => true,
        ),
        
        'venda_visita_agendada' => array(
	    'name'     => 'Retorno Agendado',
	    'type'     => 'datetime',
	    'especial' => 'calendar',
            'mindate'  => 'now',
	    'grid'    => true,
	    'display' => true,
            'description' => 'Marque uma data de Retorno ao cliente'
        ),         
        
        'venda_visita_descricao' => array(
	    'name'     => 'Detalhes',
	    'type'     => 'text',
	    'grid'    => true,
            'description' => 'Salve os detalhes da visita. Por exemplo: dificuldade de chegar ao local ou se o cliente tem interesse em outros produtos'
        ),
        
        'venda_visita_comparecerao' => array(
	    'name'     => 'Comparecerão no Evento',
	    'display' => true,
	    'fkey'    => array(
                'filther'       => "",
                'cardinalidade' => 'nn',
	        'model'         => 'venda/visitacomp',
	        'keys'          => array('venda_funcionario_cod', 'venda_funcionario_nome'),
                'sort'          => 'venda_funcionario_nome ASC',
                'formmodel'     => 'venda/visita',
                'onupdate'      => 'cascade',
                'ondelete'      => 'cascade'
	    ),
            'description' => 'Funcionários da empresa que comparecerão ao evento'
        ),
        
        'venda_visita_mensagens' => array(
            'name'          => 'Mensagens',    
            'especial'      => 'hide',
            'display'       => true,
            //'permission'    => 'Venda_TELEMKT',
            'fkey'      => array(
                'sort'          => 'criado DESC',
                'limit'         => 10,
                'model' 	=> 'venda/visitahist',
                'keys'          => array('cod', 'cod'),
                'cardinalidade' => 'n1'//nn 1n 11
            )
        ),
	'button' => array('button' => 'Gravar Visita'));
    
    public function is_saved($cod_visita){
        return ($this->getCount("$this->pkey = '$cod_visita' AND venda_visita_bdstatus = 'saved' ") > 0);
    }

    public function getDados() {
        
        if(isset($_SESSION['venda/empresa'])){
           $this->dados['venda_visita_comparecerao']['fkey']['filther'] = 
                   "venda_funcionario.venda_empresa_cod = '".$_SESSION['venda/empresa']."'";
        }
        
        if(!defined('LINK') || (LINK == "venda/visita" && CURRENT_ACTION == "edit")){
            //retira os status proibidos na edição
            unset($this->dados['venda_visita_status']['options']['confirmado']);
            unset($this->dados['venda_visita_status']['options']['negado']);
            unset($this->dados['venda_visita_status']['options']['compareceu']);
        }
        
        if(isset($_SESSION['venda/empresa'])){
            //filtra os usuários pela empresa
            $this->LoadModel('venda/funcionario', 'func');
            $tb = $this->func->getTable();
            $this->dados['venda_funcionario_cod']['filther'] = "$tb.venda_empresa_cod = '".$_SESSION['venda/empresa']."'";

            //seta os funcionários que comparecerão ao evento por default
            if(isset($_SESSION['venda/visita'])){
                $item = $this->getItem($_SESSION['venda/visita']);
                if(!empty($item) && $item['__venda_visita_bdstatus']=='unsaved' && empty($item['venda_visita_comparecerao'])){
                    $this->LoadModel('venda/visitacomp', 'vcomp');
                    $funcionarios = $this->func->getFuncionarioByEmpresa($_SESSION['venda/empresa']);
                    foreach($funcionarios as $funcionario){
                        $post = array(
                            'venda_funcionario_cod' => $funcionario['venda_funcionario_cod'],
                            'venda_visita_cod'      => '',
                            'cod_usuario'           => ''
                        );
                        $this->vcomp->inserir($post);
                    }
                    $this->getItem($_SESSION['venda/visita'], '', true);
                }
            }
        }
        
        $this->LoadModel('venda/equipe', 'eq');
        if(!isset($_SESSION['venda/equipe'])){
            $cod = $this->eq->getCodEquipeOfUser();
            if($cod != "") $_SESSION['venda/equipe'] = $cod;
        }
        
        $this->LoadModel('venda/integrante', 'int');
        if($this->int->proxEvLiberado()){
            $eventos = $this->eq->getEventosAtivosDaEquipe($_SESSION['venda/equipe']);
            if(count($eventos) != 1){
                $query   = "'".implode("', '", $eventos)."'";
                $this->dados['venda_evento_cod']['filther'] = "venda_evento_cod IN($query)";
                unset($this->dados['venda_evento_cod']['especial']);
            }else $_SESSION['venda/evento'] = array_shift($eventos);
        }
        
        //seta a data máxima para o retorno agendado como sendo o término do evento
        if(isset($_SESSION['venda/evento'])){
            $this->LoadModel('venda/evento', 'ev');
            $termino = $this->ev->getTerminoDivulgacao($_SESSION['venda/evento']);
            if($termino != "") $this->dados['venda_visita_agendada']['maxdate'] = $termino;
        }
        
        $var = parent::getDados();
        if(!defined('CURRENT_ACTION') || CURRENT_ACTION == "formulario" && LINK == $this->model_name){
            $var['venda_contato_cod']['default'] = '1';
        }
        
        return $var;
    }
    public function getNumVisitasOfUserOnEvent($cod_usuario, $cod_evento){
        return $this->getCount("cod_usuario = '$cod_usuario' AND venda_evento_cod = '$cod_evento'");
    }
    
    public function getNumComparecimentosOfUserOnEvent($cod_usuario, $cod_evento){
        $this->LoadModel('venda/participantes', 'par');
        $this->db->Join($this->getTable(), $this->par->getTable());
        return $this->getCount("cod_usuario = '$cod_usuario' AND venda_evento_cod = '$cod_evento'");
    }
    
    public function inserir($dados) {
        if(!parent::inserir($dados)) return false;
        
        //se registrou a visita, então remove a session
        if(isset($_SESSION['venda/empresa']))     unset($_SESSION['venda/empresa']);
        if(isset($_SESSION['venda/funcionario'])) unset($_SESSION['venda/funcionario']);
        return true;
    }
    
    public function getByEquipe($cod_equipe, $page, $link, $qtd){
        return $this->paginate($page, $link, '', '', $qtd, array(), "$this->tabela.venda_equipe_cod = '$cod_equipe'");
    }
    
    public function getByEventUser($cod_equipe, $page, $link, $qtd){
        $cod_usuario = usuario_loginModel::CodUsuario();
        return $this->paginate($page, $link, '', '', $qtd, array(), 
               "$this->tabela.venda_equipe_cod = '$cod_equipe' AND 
                $this->tabela.cod_usuario = '$cod_usuario'"
        );
    }
    
    public function pendentes($page){
        $adwhere = "venda_visita_status = 'pendente' AND now() > DATE_ADD(venda_visita_criado, INTERVAL ".TEMPO_ALTERACAO_VENDEDOR.")";
        return $this->paginate($page, '', '', '', 20, array(), $adwhere);
    }
    
    public function aprovou($page){
        $adwhere = "venda_visita_status = 'aprovou' AND now() > DATE_ADD(venda_visita_criado, INTERVAL ".TEMPO_ALTERACAO_VENDEDOR.")";
        return $this->paginate($page, '', '', '', 20, array(), $adwhere);
    }
    
    public function recusou($page){
        $adwhere = "venda_visita_status = 'recusou' AND now() > DATE_ADD(venda_visita_criado, INTERVAL ".TEMPO_ALTERACAO_VENDEDOR.")";
        return $this->paginate($page, '', '', '', 20, array(), $adwhere);
    }
    
    public function todas($page){
        $adwhere = "venda_visita_status != 'recusou' AND now() > DATE_ADD(venda_visita_criado, INTERVAL ".TEMPO_ALTERACAO_VENDEDOR.")";
        return $this->paginate($page, '', '', '', 20, array(), $adwhere);
    }
    
    public function paginate($page, $link = "", $cod_item = "", $campo = "", $qtd = 20, $campos = array(), $adwhere = "", $orderby = "") {
        $adwhere = "venda_visita_bdstatus != 'unsaved'" . (($adwhere == "")?"":"AND $adwhere");
        return parent::paginate($page, $link, $cod_item, $campo, $qtd, $campos, $adwhere, $orderby);
    }

    public function editar($id, $post, $camp = "") {
        $old = $this->getItem($id, $camp);
        if(empty($old)){
            $this->setErrorMessage('Item apagado ou não existe');
            return false;
        }
        $post['venda_visita_bdstatus'] = 'saved';
        if(!parent::editar($id, $post, $camp)) return false;
        
        $msg = $this->genLogMessage($post, $old, $id);
        $this->LoadClassFromPlugin('venda/visita/visitaLog', 'vlog');
        $this->vlog->saveLog($msg);
        //$this->alertar($post['venda_visita_bdstatus'], $post);
        return true;
    }
    
    /**
     * Gera e salva a mensagem de log
     */
    private function genLogMessage($dados_novos, $dados_antigos, $cod_visita){     
        $this->LoadClassFromPlugin('venda/visita/visitaLog', 'vlog');
        return $this->vlog->LogVisita($this->dados, $dados_novos, $dados_antigos, $cod_visita);
    }
    
    /**
     * Procura por funcionários, visitas ou empresas que não foram completamente salvo. 
     * @param int $cod_usuario <p>Código do vendedor que não terminou de cadastrar o dado</p>
     * @return String Uma frase contendo um link para uma empresa, visita ou funcionário que não
     * foram completamenta salvos. String vazia caso não encontre dados não salvos
     */
    public function VisitasEmAberto(){
        if(CURRENT_CONTROLLER != "equipe") return "";
        $this->LoadClassFromPlugin('venda/visita/visitaEmAberto', 'vopen');
        $cod_usuario = usuario_loginModel::CodUsuario();
        return $this->vopen->findUnsavedVisitaData($cod_usuario);
    }

}
?>